home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / iflib / lutil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-10  |  4.4 KB  |  265 lines

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <sys/stat.h>
  6. #include <string.h>
  7. #include <varargs.h>
  8. #include <errno.h>
  9. #include <time.h>
  10. #ifdef HAS_SYSLOG
  11. #include <syslog.h>
  12. #else
  13. #define LOG_USER 0
  14. #endif
  15.  
  16. #ifdef HAS_SYSLOG
  17. static int syslog_opened=0;
  18. #else
  19. FILE *logfile=NULL;
  20. FILE *errfile=NULL;
  21. #endif
  22. int logfacility=LOG_USER;
  23. char *myname="unknown";
  24. char *logname="/tmp/tmplog";
  25. char *errname="/tmp/tmplog";
  26. unsigned long verbose=0L;
  27.  
  28. void setmyname(arg)
  29. char *arg;
  30. {
  31.     if ((myname=strrchr(arg,'/'))) myname++;
  32.     else myname=arg;
  33. }
  34.  
  35. char *strerror(errno)
  36. int errno;
  37. {
  38.     extern char *sys_errlist[];
  39.     extern int sys_nerr;
  40.     if ((errno >= 0) && (errno <= sys_nerr))
  41.         return(sys_errlist[errno]);
  42.     else
  43.         return("unknown error");
  44. }
  45.  
  46. static char *mon[] = {
  47. "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
  48. };
  49.  
  50. char *date(t)
  51. time_t t;
  52. {
  53.     struct tm ptm;
  54.     time_t now;
  55.     static char buf[20];
  56.  
  57.     if (t) now=t; 
  58.     else time(&now);
  59.     ptm=*localtime(&now);
  60.     sprintf(buf,"%s %02d %02d:%02d:%02d",
  61.         mon[ptm.tm_mon],ptm.tm_mday,
  62.         ptm.tm_hour,ptm.tm_min,ptm.tm_sec);
  63.     return(buf);
  64. }
  65.  
  66. static char *pbuff = NULL;
  67.  
  68. char *printable(s,l)
  69. char *s;
  70. int l;
  71. {
  72.     int len;
  73.     char *p;
  74.  
  75.     if (pbuff) free(pbuff);
  76.     pbuff=NULL;
  77.  
  78.     if (s == NULL) return "(null)";
  79.  
  80.     if (l > 0) len=l;
  81.     else if (l == 0) len=strlen(s);
  82.     else
  83.     {
  84.         len=strlen(s);
  85.         if (len > -l) len=-l;
  86.     }
  87.     pbuff=(char*)malloc(len*4+1);
  88.     p=pbuff;
  89.     while (len--)
  90.     {
  91.         if (*(unsigned char*)s >= ' ') *p++=*s;
  92.         else switch (*s)
  93.         {
  94.         case '\\': *p++='\\'; *p++='\\'; break;
  95.         case '\r': *p++='\\'; *p++='r'; break;
  96.         case '\n': *p++='\\'; *p++='n'; break;
  97.         case '\t': *p++='\\'; *p++='t'; break;
  98.         case '\b': *p++='\\'; *p++='b'; break;
  99.         default:   sprintf(p,"\\%03o",*s); p+=4; break;
  100.         }
  101.         s++;
  102.     }
  103.     *p='\0';
  104.     return pbuff;
  105. }
  106.  
  107. char *printablec(c)
  108. char c;
  109. {
  110.     return printable(&c,1);
  111. }
  112.  
  113.         /* log and debug outputs */
  114.  
  115. #define PRINT_DEBUG(fmt,args) \
  116.     vfprintf(stderr,*fmt == '$' ? fmt+1 : fmt,args);\
  117.     if (*fmt == '$')\
  118.         fprintf(stderr,"\n\terrno=%d : %s\n",\
  119.             errno,strerror(errno));\
  120.     else\
  121.         fprintf(stderr,"\n");\
  122.     fflush(stderr);
  123.  
  124. #define PRINT_LOGFILE(lfile,fmt,args) \
  125.     fprintf(lfile,"%s local %s[%d]: ",date(0L),myname,getpid());\
  126.     vfprintf(lfile,*fmt == '$' ? fmt+1 : fmt,args);\
  127.     if (*fmt == '$')\
  128.         fprintf(lfile,"\n\terrno=%d : %s\n",\
  129.             errno,strerror(errno));\
  130.     else\
  131.         fprintf(lfile,"\n");\
  132.     fflush(lfile);
  133.  
  134. #define PRINT_SYSLOG(level,fmt,args) \
  135.     vsyslog(level,*fmt == '$' ? fmt+1 : fmt,args);\
  136.     if (*fmt == '$')\
  137.         syslog(level,"\terrno=%d : %s",\
  138.                         errno,strerror(errno));
  139.  
  140. void loginf(va_alist)
  141. va_dcl
  142. {
  143.     va_list    args;
  144.     char    *fmt;
  145. #ifndef HAS_SYSLOG
  146.     int    oldmask;
  147. #endif
  148.  
  149.     va_start(args);
  150.     fmt=va_arg(args, char*);
  151.     if (verbose)
  152.     {
  153.         PRINT_DEBUG(fmt,args);
  154.     }
  155. #ifdef HAS_SYSLOG
  156.     if (!syslog_opened)
  157.     {
  158.         openlog(myname,LOG_PID|LOG_CONS,logfacility);
  159.         syslog_opened=1;
  160.     }
  161.     PRINT_SYSLOG(LOG_INFO,fmt,args);
  162. #else
  163.     if (!logfile)
  164.     {
  165.         oldmask=umask(066);
  166.         logfile=fopen(logname,"a");
  167.         umask(oldmask);
  168.         if (logfile == NULL)
  169.         {
  170.             perror("Cannot open log file");
  171.             return;
  172.         }
  173.     }
  174.     PRINT_LOGFILE(logfile,fmt,args);
  175. #endif
  176.     va_end(args);
  177.     return;
  178. }
  179.  
  180. void logerr(va_alist)
  181. va_dcl
  182. {
  183.     va_list    args;
  184.     char    *fmt;
  185. #ifndef HAS_SYSLOG
  186.     int    oldmask;
  187. #endif
  188.  
  189.     va_start(args);
  190.     fmt=va_arg(args, char*);
  191.     if (verbose)
  192.     {
  193.         PRINT_DEBUG(fmt,args);
  194.     }
  195. #ifdef HAS_SYSLOG
  196.     if (!syslog_opened)
  197.     {
  198.         openlog(myname,LOG_PID|LOG_CONS,logfacility);
  199.         syslog_opened=1;
  200.     }
  201.     PRINT_SYSLOG(LOG_ERR,fmt,args);
  202. #else
  203.     if (!errfile)
  204.     {
  205.         oldmask=umask(066);
  206.         errfile=fopen(errname,"a");
  207.         umask(oldmask);
  208.         if (errfile == NULL)
  209.         {
  210.             perror("Cannot open log file");
  211.             return;
  212.         }
  213.     }
  214.     PRINT_LOGFILE(errfile,fmt,args);
  215. #endif
  216.     va_end(args);
  217.     return;
  218. }
  219.  
  220. void debug(va_alist)
  221. va_dcl
  222. {
  223.     va_list    args;
  224.     unsigned long    level;
  225.     char    *fmt;
  226.  
  227.     va_start(args);
  228.     level=va_arg(args, unsigned long);
  229.     fmt=va_arg(args, char*);
  230.  
  231.     if ((verbose && (level == 0)) || (verbose & (1 << (level-1))))
  232.     {
  233.         PRINT_DEBUG(fmt,args);
  234.     }
  235.     va_end(args);
  236.     return;
  237. }
  238.  
  239. unsigned long setverbose(s)
  240. char *s;
  241. {
  242.     int shift;
  243.     unsigned long tv=0L;
  244.     int bad=0;
  245.  
  246.     if (strlen(s) == strspn(s,"0123456789"))
  247.     {
  248.         shift=atoi(s);
  249.         if ((shift > 0) && (shift <= 32))
  250.             while (--shift >= 0)
  251.                 tv |= 1<<shift;
  252.         else if (shift != 0) bad=1;
  253.     }
  254.     else while ((shift=*s++))
  255.     {
  256.         if ((shift >= 'A') && (shift <= 'Z'))
  257.             shift += ('a'-'A');
  258.         if ((shift >= 'a') && (shift <= 'z'))
  259.             tv |= 1<<(shift -'a');
  260.         else bad=1;
  261.     }
  262.     if (bad) fprintf(stderr,"invalid debug verbosity code\n");
  263.     return tv;
  264. }
  265.